#ifndef _THREAD_POOL_H
#define _THREAD_POOL_H

#include<iostream>
#include<vector>
#include<functional>
#include<thread>
#include<mutex>
#include<queue>
#include<condition_variable>

using namespace std;
class ThreadPool
{
private:
    /// @brief 线程的最大数量
    size_t t_num_;
    /// @brief 存储所有的线程
    vector<thread> threads_;
    /// @brief 保护队列的互斥锁
    mutex mutex_;
    queue<function<void()>> task_que_;
    /// @brief 条件变量
    condition_variable task_cv_;
    /// @brief 是否停止，true表示停止
    bool stop_;
    /// @brief 启动线程池
    /// @return 成功返回true，失败返回false
    bool start();

public:
    /// @brief 构造函数，创建线程池并启动
    /// @param n 线程池内线程的总数
    /// @return run_time_error
    ThreadPool(size_t n);
    ~ThreadPool();

    /// @brief 将一个任务添加到线程池中
    void add(const function<void()>& func);
};

#endif